package com.wms.service.impl;

import com.wms.bean.PageBean;
import com.wms.dto.*;
import com.wms.entity.AllocateIn;
import com.wms.entity.AllocateInDetail;
import com.wms.entity.Stock;
import com.wms.mapper.AllocateInMapper;
import com.wms.mapper.StockInMapper;
import com.wms.service.AllocateInService;

import com.wms.service.StockInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 调拨入库服务实现类; (实现调拨记录的业务逻辑)
 * @author : 您的名字或参考 http://www.chiner.pro
 * @date : 2025-8-24
 */
@Service
public class AllocateInServiceImpl implements AllocateInService {

    @Autowired
    private AllocateInMapper allocateInMapper;
    //对库存变动
    @Autowired
    private StockInMapper stockInMapper;
    @Override
    public PageBean<List<AllocateInVo>> queryPageAndCondition(AllocateInDTO allocateInDTO) {
        // 这里假设分页逻辑已由 PageVo 处理，Mapper 返回全部符合条件的数据
        List<AllocateInVo> list = allocateInMapper.queryPageAndCondition(allocateInDTO);
        PageBean<List<AllocateInVo>> pageBean = new PageBean<>();
        pageBean.setList(list);
        // 假设 total 需要额外查询，暂用 list.size() 替代
        pageBean.setTotal(list.size());
        pageBean.setPage(allocateInDTO.getPage());
        pageBean.setPageSize(allocateInDTO.getPageSize());
        return pageBean;
    }

    @Override
    public int insert(AllocateInUpVo allocateInUpVo) {
        return allocateInMapper.insert(allocateInUpVo);
    }

    /**
     * 更新调拨入库状态
     * @param allocateInUpVo 调拨信息
     * @return 影响行数
     */
    @Override
    public int update(AllocateInUpVo allocateInUpVo) {
        return allocateInMapper.update(allocateInUpVo);
    }

    @Override
    public int deleteById(int id) {
        return allocateInMapper.deleteById(id);
    }


    @Override
    public PageBean<List<CallProcessVO>> queryProcessPageAndCondition(CallProcessDTO callProcessDTO) {
        // 这里假设分页逻辑已由 PageVo 处理，Mapper 返回全部符合条件的数据
        List<CallProcessVO> list = allocateInMapper.queryProcessPageAndCondition(callProcessDTO);
        PageBean< List<CallProcessVO>> pageBean = new PageBean<>();
        pageBean.setList(list);
        // 假设 total 需要额外查询，暂用 list.size() 替代
        pageBean.setTotal(list.size());
        pageBean.setPage(callProcessDTO.getPage());
        pageBean.setPageSize(callProcessDTO.getPageSize());
        return pageBean;
    }

    /**
     *  更新调拨处理同时更改库存内容
     */
    @Override
    public int updateInStoreDetail(AllocateInDetailUpVo allocateInDetailUpVo) {
        //根据id查询调拨处理的数据
        CallProcessVO callProcessVO =  allocateInMapper.selectInStoreDetail(allocateInDetailUpVo.getId());
        return allocateInMapper.updateInStoreDetail(allocateInDetailUpVo);
    }

    @Override
    @Transactional
    public int allocateInTypeVo(AllocateInTypeVo allocateInTypeVo) {
        //根据传入的查询出对应的内容
        AllocateIn allocateIn = allocateInMapper.getAllocateInWithDetailByDetailId(allocateInTypeVo.getId());
        AllocateInDetail allocateInDetail  = allocateIn.getAllocateInDetailList().get(0);
        //执行对库存的更改
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();

        // 定义格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 格式化为字符串
        String formatted = now.format(formatter);
        //批次表中加入数据
        stockInMapper.updateBatchNum(allocateInDetail.getBatch(),allocateInDetail.getMid(),formatted);
        //先进行判断入库操作
        List<InTypeDTO> inTypeDTOS = allocateInMapper.selectAllocateType();
        boolean boo = false;
        for(int i=0;i<inTypeDTOS.size();i++){
            InTypeDTO inTypeDTO = inTypeDTOS.get(i);
            //同时判断批次号  物料id 和 库区id
            if(inTypeDTO.getBatchNO().equals(allocateInDetail.getBatch())){
                //相同则增加的库存数量
                boo = true;
                break;
            }
        }
        //说明没有上面条件相同的形式
        if(!boo){
            //直接新插入一条数据
        }
        //向库区库存中加入数据


        return 0;
    }
}